#include "AdministradorABM.h"
using namespace ABM;
#include "../Encriptacion/RSA.h"
using namespace Encriptacion;



AdministradorABM::AdministradorABM() :
	IAbm("Administrador") {
	this->manejadorAdministrador = new ManejadorAdministrador();

}

bool AdministradorABM::altaInterna(string usr, string pass) {

	usr = Utils::aMinuscula(usr);
	pass = Utils::aMinuscula(pass);

	Administrador* admin = new Administrador();
	admin->setUsuario(usr);
	admin->setContrasenia(pass);
	bool resultado = manejadorAdministrador->alta(admin);

	delete admin;
	return resultado;
}

bool AdministradorABM::alta() {
	string usr = "";
	string contrasenia = "";
	bool resultado = false;

	cout << "Ingrese el Usuario ADMIN: ";
	getline(cin,usr);
	usr = Utils::aMinuscula(usr);

	cout << "Ingrese la CONTRASEÑA: ";
	getline(cin, contrasenia);
	contrasenia = Utils::aMinuscula(contrasenia);
	
	if (!this->manejadorAdministrador->existe(usr)){
		resultado = altaInterna(usr, contrasenia);

		// genero las claves públicas y privadas para el admin recien creado
		if (resultado){

			this->crearDirectorios(usr);

			cout << "generando claves para encriptación, aguarde un momento por favor" << endl;
			RSA* encriptadorPorRSA = new RSA();
			string pathDeLaCarpetaDeLasClaves = encriptadorPorRSA->generarParDeClaves(usr);
			delete encriptadorPorRSA;

			cout << "Se han creado las claves para encriptacion del usuario en la carpeta: ";
			cout << "TPVotoElectronico/Administradores/" +pathDeLaCarpetaDeLasClaves+ "/Claves" << endl;
		}
	}
	else{
		cout << "Usuario existente!!!" << endl;
		resultado = false;
	}
	return resultado;
}

bool AdministradorABM::baja() {
	bool resultado = false;
	Administrador* admin = new Administrador();

	string usr = "";
	string contrasenia = "";
	cout << "Ingrese el Usuario ADMIN: ";
	cin >> usr;
	cout << "Ingrese la CONTRASEÑA: ";
	cin >> contrasenia;

	admin->setUsuario(Utils::aMinuscula(usr));
	admin->setContrasenia(Utils::aMinuscula(contrasenia));

	resultado = this->manejadorAdministrador->baja(admin);

	delete admin;

	return resultado;
}

bool AdministradorABM::modificacion(){
	cout << "Los ADMINISTRADORES no tiene campos modificables" << endl;
	getchar();

	return false;
}

void AdministradorABM::altaMasiva(){
	ArchivoAltasMasivas* arch = new ArchivoAltasMasivas("administradorCargaMasiva.txt");
	string linea;
	linea = arch->leerLinea();
	while (!arch->finDeArchivo()) {
		vector<string>* campos = Parser::separarCampos(&linea, separadorCampos);
		//como son administradores se que tiene 2 campos. usr y pass
		if(campos->size() == 2){
			for (int i = 0; i < 2; ++i) {
				Parser::reemplazarCaracter(&campos->at(i), separadorPalabras, blanco);
			}
			if (altaInterna(Utils::aMinuscula(campos->at(0)), Utils::aMinuscula(campos->at(1)))){
				this->crearDirectorios(Utils::aMinuscula(campos->at(0)));
				RSA* encriptadorPorRSA = new RSA();
				string pathDeLaCarpetaDeLasClaves = encriptadorPorRSA->generarParDeClaves(Utils::aMinuscula(campos->at(0)));
				delete encriptadorPorRSA;
			}
			linea = arch->leerLinea();
		}
		this->log->escribir("Se genero Alta Masiva de Administrador.");
	}

	delete arch;
}

bool AdministradorABM::listar(){
	bool listOK= false;
	if (this->manejadorAdministrador->listarTodos()){
		system("chmod 755 ../TPVotoElectronico/Reportes/ListadoAdministradores.txt");
		system("gedit ../TPVotoElectronico/Reportes/ListadoAdministradores.txt");
		listOK = true;
	}else{
		cout << "No se encuentra ningun Listado de Administradores." << endl;
		cout << "Asegurese que se encuentran Administradores cargados" << endl;
	}
	return listOK;
}

void AdministradorABM::crearDirectorios(string usr){

	//Se crean las carpetas del administrador para las claves, y los mensajes
	Configuracion* config = Configuracion::getInstancia();
	string comando = "mkdir -m 777 -p " + config->getPathAdministradores() + "/"+ usr +"/Claves/";
	system(comando.c_str());
	comando = "mkdir -m 777 -p " + config->getPathAdministradores() + "/"+ usr +"/Mensajes/";
	system(comando.c_str());

}

AdministradorABM::~AdministradorABM() {
}
